package ar.com.algotres.tpdos.modelo.fisica;

import ar.com.algotres.tpdos.modelo.fisica.direcciones.Direccion;

public class Posicion implements Comparable<Posicion> {

	private static boolean esValidoLimiteInferior(int coordenadaX,
			int coordenadaY) {
		return coordenadaX >= 0 && coordenadaY >= 0;
	}

	private static boolean esValidoLimiteSuperior(int coordenadaX,
			int coordenadaY) {
		return coordenadaX <= 10 && coordenadaY <= 10;
	}

	private Integer coordenadaX;
	private Integer coordenadaY;

	public Posicion(Integer coordenadaX, Integer coordenadaY)
			throws CoordenadasDePosicioInvalidaException {
		super();
		if (Posicion.esValidoLimiteInferior(coordenadaX, coordenadaY)
				&& Posicion.esValidoLimiteSuperior(coordenadaX, coordenadaY)) {
			this.coordenadaX = coordenadaX;
			this.coordenadaY = coordenadaY;
		} else {
			throw new CoordenadasDePosicioInvalidaException();
		}
	}

	@Override
	public int compareTo(Posicion posicion) {

		int comparacionX = coordenadaX.compareTo(posicion.coordenadaX);
		int comparacionY = coordenadaY.compareTo(posicion.coordenadaY);
		if (this.equals(posicion)) {
			return 0;
		} else if (comparacionX < 0) {
			return -1;
		} else if (comparacionY < 0 && comparacionX == 0) {
			return -1;
		} else {
			return 1;
		}
	}

	@Override
	public boolean equals(Object obj) {
		Posicion other = (Posicion) obj;
		if (coordenadaX == null) {
			if (other.coordenadaX != null)
				return false;
		} else if (!coordenadaX.equals(other.coordenadaX))
			return false;
		if (coordenadaY == null) {
			if (other.coordenadaY != null)
				return false;
		} else if (!coordenadaY.equals(other.coordenadaY))
			return false;
		return true;
	}

	public Integer getCoordenadaX() {
		return coordenadaX;
	}

	public Integer getCoordenadaY() {
		return coordenadaY;
	}

	public Posicion siguienteEn(Direccion direccion)
			throws CoordenadasDePosicioInvalidaException {
		return direccion.damePosicionSiguiente(this);
	}

	@Override
	public String toString() {
		return "Posicion [ coordenadaX=" + coordenadaX + ", coordenadaY="
				+ coordenadaY + "]";
	}
}
